<?php 
  	if (DEBUGPRINT) echo '<br> PDO.class';


/**
 * @author nit
 *
 */
class CSVClass {

// Определение настроек базы данных


private $defaults = array(
		'dbtype'    => DB_TYPE,
		'host'      => DB_HOST,
		'user'      => DB_USER,
		'pass'      => DB_PASSWORD,
		'dbname'    => DB_DBNAME,
		'tmessages' => DB_TMESSAGES,
		'tcoments'  => DB_TCOMENTS,
		'tmessagesfile' => DB_TMESSAGESFILE,
		'tcomentsfile'  => DB_TCOMENTSFILE,
		'port'      => NULL,
		'socket'    => NULL,
		'pconnect'  => FALSE,
		'charset'   => 'utf8',
		'errmode'   => 'error', //or exception
		'exception' => 'Exception', //Exception class name
	);


    private $TMESSAGES;
	private $TCOMENTS;
	private $CHARSET;
	
	private $ArrayHeaderMessage = array ('id'=>'id',
										 'datetime'=>'datetime',
									     'name'=>'name',
										 'message'=>'message');
	private $ArrayHeaderComent = array ('comentid'=>'comentid',
										'comentdatetime'=>'comentdatetime',
										'comentname'=>'comentname',
										'coment'=>'coment',
										'messageidid'=>'messageidid'
										);
	
	
	private $conn;
	private $length;
	private $delimiter;
	
	
	//Файлы с сообщениями и комментариями
	private $TMESSAGESFILE;
	private $TCOMENTSFILE;
	private $DELIMITER ; //Разделитель полей
	
	//Массивы с с сообщениями и комментариями
	private $TMESSAGESARRAY;
	private $TCOMENTSARRAY;
	
	/**
    * Конструктор класса
    *
    * Устанавливает соединение с базой данных MySQL, выбирает базу и устанавливает кодировку UTF8
    */
  public function __construct($delimiter =";",$length=1000)
  {
  	 
  	
  	if (DEBUGPRINT) echo '<br> construct CSV';
		
		
        $this->TMESSAGESFILE = $this->defaults['tmessagesfile'];
        $this->TCOMENTSFILE = $this->defaults['tcomentsfile'];
		$this->CHARSET 	 = $defaults['charset'];
		
		
		$this->length = $length;
		$this->delimiter = $delimiter;
		
		$this->install($this->TMESSAGESFILE,$this->ArrayHeaderMessage);
		$this->install($this->TCOMENTSFILE,$this->ArrayHeaderComent);
		
		$this->TMESSAGESARRAY = $this -> CSVtoArray($this->TMESSAGESFILE,$this->ArrayHeaderMessage);
		$this->TCOMENTSARRAY = $this -> CSVtoArray($this->TCOMENTSFILE,$this->ArrayHeaderComent);
		
		
	return $conn;

  }
  
  
  
  
  private function CSVtoArray ($filename,$array)
  {
  	if (DEBUGPRINT) echo '<br> CSVtoArray CSV';
  	if (($handle = fopen($filename, "r")) !== FALSE) {
  		# Индекс строки двумерного массива = 0.
   		$n=0;
  		$records = fgetcsv($handle, 1000, $this->delimiter); //строка заголовков из файла
  		$count_record=count($records);
  		if (count($records) == count($array)) 
  		{
  			while (($data = fgetcsv($handle, 1000, $this->delimiter)) !== FALSE) {
  			for ($i=0; $i++<$count_record;)
  			{
  				$MessageCSVtoArray[$n][$records[$i]]=$data[$i];
  			}	
  		    $n++;
  		}
  		fclose($handle);
  		return $MessageCSVtoArray;
  		}
  		echo '<br> неверное отношение массив/файл';
  	}
  	
  	return FALSE;
  	
  	
  	
  }  
  
  /**
   * Метод для создания таблиц с сообщениями и комментариями
   * если нет файлов, то создает файлы и заполняет строку заголовков
   * 
   * @access private
   */
  private function  install($filename,$ArrayHeader)
  {
  	if (DEBUGPRINT) echo '<br> install CSV';
  	IF (($handle = fopen($filename, "r")) !== FALSE)
  	{
  	if (DEBUGPRINT) echo '<br>Файл есть '.$filename;
  	}
  	else 
  	{
  		$handle = fopen($filename, "x");
  		if (DEBUGPRINT) echo '<br>Файла нет '.$filename;
  		fputcsv($handle,$ArrayHeader,$this->delimiter);
  	}
  	fclose($handle);  	
  }
 
  
    
  /**
   * Деструктор класса
   *
   * Закрывает соединение с базой данных, если оно было установлено
   */
  function __destruct() 
  {
  	 $TMESSAGESARRAY = null;
	 $TCOMENTSARRAY = null;
  }
  
  

 


   /**
     * Метод для добавления сообщения
     *
     * @access public
     * @param String $message текст сообщения
     * @param String $name имя автора сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function addMessage($message, $name) {
        if (!is_string($message) || !is_string($name) || empty($message) || empty($name) ) {
             if (DEBUGPRINT) {
                echo ('<br>addMessage: не верный тип данных');
                echo ('<br>$message is ' . gettype($message));
                echo ('<br>$name is ' . gettype($name));
             }
            return FALSE;                        
        }
        $this->insertIntoTable(
                $this->TMESSAGES,
                'message, name, datetime ',
                $this->SaveString($message) . ", " .
                $this->SaveString($name) .
                ", NOW()");
        
        
    }
  
    /**
     * Метод для удаления сообщения
     *
     * @access public
     * @param Numeric $id id сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
     public function  DelMessage($id)
	 {
       if (!is_numeric($id)) {
            if (DEBUGPRINT)  {
                echo ('<br>deleteMessage: wrong argument type');
                echo ('<br>$id is ' . gettype($id));
            }
            return FALSE;
        }
	   echo "Удалили собщение";
			 
	    echo "deleteRowsFromTable";
        $success = $this->deleteRowsFromTable(
                $this->TMESSAGES,
                "id =". $id);
        
		 echo "deleteRowsFromTable";
		$success = $this->deleteRowsFromTable(
                $this->TCOMENTS,
                "messageid =". $id);
		 echo "deleteRowsFromTable";
		 
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение удалено.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка: сообщение не было удалено\n";
        return $success;
        
        
        }
   /**
     * Метод для удаления комментария
     *
     * @access public
     * @param Numeric $id id комментария
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
     public function  DelComent($id)
	 {
       if (!is_numeric($id)) {
            if (DEBUGPRINT)  {
                echo ('<br>DelComent: wrong argument type');
                echo ('<br>$id is ' . gettype($id));
            }
            return FALSE;
        }
		$success = $this->deleteRowsFromTable(
                $this->TCOMENTS,
                "comentid =". $id);

		 
        if ($success && DEBUGPRINT)
            echo "<br>Комментарий удален.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка: комментарий не был удален\n";
        return $success;
               
        }
  
  
  
  
  
     /**
     * Метод для добавления комментария
     *
     * @access public $messageid, $coment, $comentname
     * @param Integer $messageid ID сообщения
	 * @param String $coment тект комментария
     * @param String $comentname имя автора комментария
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function addComent($messageid, $coment, $comentname) {
        	
			echo $messageid;
			echo $coment;
			echo $comentname;
			echo '----------------------------------';
        if (!is_integer($messageid) || !is_string($coment) || empty($comentname) || empty($coment) || empty($messageid) ) {
             if (DEBUGPRINT) {
                echo ('<br>addComent: не верный тип данных');
                echo ('<br>$messageid is ' . gettype($messageid));
                echo ('<br>$coment is ' . gettype($coment));
				echo ('<br>$comentname is ' . gettype($comentname));
             }
            return FALSE;                        
        }
        $success = $this->insertIntoTable(
                $this->TCOMENTS,
                'messageid, coment, comentname, comentdatetime ',
                $messageid . " , ".
                $this->SaveString($coment) . "," .
                $this->SaveString($comentname) .
                ", NOW()");
        
        if ($success && DEBUGPRINT)
            echo "<br>Комментарий добавлен добавлено.\n";
        else if (DEBUGPRINT)
            echo "<br>Ошибка при добавлении комментария.\n";
            
    
        return $success;
	  
	  /*$this->insertIntoTable(
                $this->TCOMENTS,
                'messageid, coment, comentname, comentdatetime ',
                " '26','Привте!!!!','Сережа', NOW()");
	 // INSERT INTO `gb_base`.`gb_coments` (`comentid`, `comentdatetime`, `comentname`, `coment`, `messageid`) VALUES (NULL, NOW(), 'Сережа', 'Привте!!!!', '27'); */
	 
    }

    /**
     * Метод для получения сообщения из БД
     * @access public
     * @return $rows array в случае успешного завершения метода, иначе - FALSE
     */	
  public function getmessages()
  {
  	if (DEBUGPRINT) echo '<br> DB getmessages';
	
	      $rows = array();
		$sqlresult = $this->selectRowsFromTable(
                $this->TMESSAGES,
                '*',
                '', 
                'datetime DESC');
     
       
  //  while ($rows[] = fetch_array($sqlresult));
   //     array_pop($sqlresult);
        return $sqlresult;
		
  }

  
  
  /**
   * Метод для получения сообщения из БД по его ID
   *
   * @access public
   * param Numeric $id сообщения
   * @return $rows array в случае успешного завершения метода
   */
  public function getMessage($messageid)
  {
  	if (DEBUGPRINT) echo '<br> DB getmessage';
	    $rows = array();
		$sqlresult = $this->selectRowsFromTable(
                $this->TMESSAGES,
                '*',
                'ID='.$messageid, 
                '');
       if (DEBUGPRINT) echo '<br> DB getmessages END'; 
    
	         return $sqlresult;
  }

  /**
   * Метод для изменения сообщения
   *
   * @access public $messageid, $message, $name
   * @param Integer $messageid ID сообщения
   * @param String $message текcт сообщения
   * @param String $name имя автора сообщения
   * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
   */
  public function  change_message($messageid, $message, $name)
  {
  	   if (!is_numeric($messageid) || 
            !is_string($message)       || 
            !is_string($name)) {
             if (DEBUGPRINT) {
                echo ('<br>updateMessage: wrong argument type');
                echo ('<br>$messageid is ' . gettype($messageid));
                echo ('<br>$message is ' . gettype($message));
                echo ('<br>$name is ' . gettype($name));
             }
            return FALSE;
            }            
        $success = $this->updateRowsFromTable(
                $this->TMESSAGES,
                "message = " . $this->SaveString($message." Cообщение было изменено: ".date('Y-m-d [H:i:s]')).
                ", name = " . $this->SaveString($name),
                "id = ". $messageid);
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение изменено.\n";
        else if (DEBUGPRINT)
            echo "<br>Error: сообщение не изменено.\n";
        return $success;
	
  }
  
  /**
   * Метод для изменения комментария
   *
   * @access public $messageid, $coment, $comentname
   * @param Integer $messageid ID сообщения
   * @param String $coment тект комментария
   * @param String $comentname имя автора комментария
   * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
   */
  public function  change_coment($messageid, $message, $name)
  {
  	   if (!is_numeric($messageid) || 
            !is_string($message)       || 
            !is_string($name)) {
             if (DEBUGPRINT) {
                echo ('<br>updateMessage: wrong argument type');
                echo ('<br>$messageid is ' . gettype($messageid));
                echo ('<br>$message is ' . gettype($message));
                echo ('<br>$name is ' . gettype($name));
             }
            return FALSE;
            }            
        $success = $this->updateRowsFromTable(
                $this->TCOMENTS,
                "coment = " . $this->SaveString($message." Комментарий был изменен: ".date('Y-m-d [H:i:s]')).
                ", comentname = " . $this->SaveString($name),
                "comentid = ". $messageid);
        if ($success && DEBUGPRINT)
            echo "<br>Сообщение изменено.\n";
        else if (DEBUGPRINT)
            echo "<br>Error: сообщение не изменено.\n";
        return $success;
	
  }
  
  /**
   * Метод для полученяи всех комментарий сообщеняи по его ID
   *
   * @access public $messageid
   * @param Integer $messageid ID сообщения
   * @return $rows array в случае успешного завершения метода
   */
  
  public function getAllComents($messageid)
  {
  	if (DEBUGPRINT) echo '<br> DB getAllComents';
	
	      $rows = array();
		  $sqlresult = $this->selectRowsFromTable(
                $this->TCOMENTS,
                '*',
                'messageid = ' . $messageid,
                'comentdatetime ASC');
       if (DEBUGPRINT) echo '<br> DB getAllComents END'; 
    
        return $sqlresult;
		
  }
  
  
  
  /**
   * Метод для получения комментария по его ID
   *
   * @access public $messageid
   * @param Integer $messageid ID сообщения
   * @return $rows array в случае успешного завершения метода
   */
  
  public function getComments($messageid)
  {
  	if (DEBUGPRINT) echo '<br> DB getComments';
	
	      $rows = array();
		  $sqlresult = $this->selectRowsFromTable(
                $this->TCOMENTS,
                '*',
                'comentid = ' . $messageid,
                '');
				
				echo $sqlresult;
       if (DEBUGPRINT) echo '<br> DB getComments END'; 
    
        return $sqlresult;
		
  }
  
  
  
  /**
   * Метод для изменения строк таблицы
   *
   * @access private
   * @param String $tablename Имя таблицы, из которой происходит выборка
   * @param String $setcolumns содержит список столбцов через запятую
   * @param String $clause содержит список всех условий, по умолчанию пустой (выводятся все строки)
   * @return $result в случае успешного завершения метода, иначе - FALSE
   */
  private function updateRowsFromTable($tablename, $setcolumns = '', $clause = '')
  {
  	if (!is_string($tablename)  ||
        !is_string($setcolumns) || 
        !is_string($clause)) return FALSE;
        
        if (empty($setcolumns) && DEBUGPRINT) {
            echo '<br>Update query failed: @param setcolumns missing' . "\n";
            return FALSE;
        }
        if (!empty($clause))
            $whereclause = 'WHERE ' . $clause;
        else
        $whereclause = '';
        $query = sprintf(
                "UPDATE %s SET %s %s",
                ($tablename),
                ($setcolumns),
                ($whereclause));

        // Выполняем запрос
          try {
    	$STH = $this->DBH->prepare($query);
		
		$STH ->execute();
		
		}
		catch(PDOException $e)
		{
		die("<br/>Ошибка запроса PDO: ".$e->getMessage());
		}
	
	
  }
  
  
  
  
    /**
     * Метод для выбора строк из таблицы
     *
     * @access private
     * @param String $tablename Имя таблицы, из которой происходит выборка
     * @param String $columns содержит список столбцов через запятую, по умолчанию выводятся все столбцы ('*')
     * @param String $clause содержит список всех условий, по умолчанию пустой (выводятся все строки)
     * @param String $orderby содержит список условий упорядочивания результатов запроса, по умолчанию пустой
     * @return Resource в случае успешного завершения метода, иначе - FALSE
     */
    private function selectRowsFromTable($tablename, $columns = '*', $clause = '', $orderby = '') {
        	  	if (DEBUGPRINT) echo '<br> DB selectRowsFromTable';
			
        if (!is_string($tablename) || 
            !is_string($columns)   || 
            !is_string($clause)    || 
            !is_string($orderby)) {
             if (DEBUGPRINT) {
                echo ('<br>selectRowsFromTable: wrong argument type');
                echo ('<br>$tablename is ' . gettype($tablename));
                echo ('<br>$columns is ' . gettype($columns));
                echo ('<br>$clause is ' . gettype($clause));
                echo ('<br>$orderby is ' . gettype($orderby));
            }
            return FALSE;
           }
        
        if (!empty($clause))
            $whereclause = 'WHERE ' . ($clause);
        else
            $whereclause = '';
        if (!empty($orderby))
            $orderclause = 'ORDER BY ' . ($orderby);
        else
            $orderclause = '';
		
		
		
        $query = sprintf(
                "SELECT %s FROM %s %s %s", 
                $columns,
                $tablename,
                $whereclause, $orderclause);

        // Выполняем запрос
        if (DEBUGPRINT) {    	echo ('<br>'.$query);  	
        }
        try {
    	$STH = $this->DBH->prepare($query);
		$STH ->execute();
		
		$STH->setFetchMode(PDO::FETCH_ASSOC);
		$rows =$STH -> fetchall();
		
		return $rows;
						
		}
		catch(PDOException $e)
		{
			
		die("<br/>Ошибка запроса PDO: ".$e->getMessage());
		}

    }
  
    
    

    /**
     * Метод для вставки строк в таблицы
     *
     * @access private
     * @param String $tablename Имя таблицы, из которой происходит выборка
     * @param String $columnames содержит список столбцов через запятую, по умолчанию выводятся все столбцы ('*')
     * @param String $columnvalues содержит список всех значений
     * @return $result в случае успешного завершения метода, иначе - FALSE
     */
  private function insertIntoTable($tablename, $columnnames = '', $columnvalues = '') {
        if (!is_string($tablename)   || 
            !is_string($columnnames) || 
            !is_string($columnvalues)) return FALSE;
        
        
        
        try{        
        
       /*$data= array( $tablename, $columnnames, $columnvalues);
        $STH = $DBH->prepare("INSERT INTO `?` (?) VALUES ?");
		$sth_->execute($data);*/

		
		$query = sprintf(
				"INSERT INTO `%s` (%s) VALUES (%s)",
				$tablename,
				$columnnames,
				$columnvalues);
		
		
		$STH = $this->DBH->prepare($query);
		
		$STH ->execute();
		
		}
		catch(PDOException $e)
		{
		die("<br/>Ошибка запроса PDO: ".$e->getMessage());
		}
        
        
    }
  
  
  
    /**
     * Метод для удаления строк из таблицы
     *
     * @access private
     * @param String $tablename Имя таблицы, из которой происходит выборка
     * @param String $clause содержит список всех условий, по умолчанию пустой (выводятся все строки)
     * @return $result в случае успешного завершения метода, иначе - FALSE
     */
     private function deleteRowsFromTable($tablename, $clause = '') {
        if (!is_string($tablename) || !is_string($clause)) return FALSE;
        $whereclause = '';
        if (!empty($clause))
            $whereclause = 'WHERE ' . $clause;
        else
            $whereclause = '';
        $query = sprintf(
                "DELETE FROM %s %s",
                $tablename,
                $whereclause);

        // Выполняем запрос
        

             try {
    	$STH = $this->DBH->prepare($query);
		
		$STH ->execute();
		
		}
		catch(PDOException $e)
		{
		die("<br/>Ошибка запроса PDO: ".$e->getMessage());
		}
    }
 
 
  
    /**
     * Метод для удаления из строк мусора, тегов, запросов.
     *
     * @access private
     * @param String $sstring строка
     * @return $sstring в случае успешного завершения метода, иначе - пусто
     */
   private function SaveString($sstring) {
        if (is_string($sstring))
		{
		$sstring = trim($sstring);
		$sstring = stripslashes($sstring);
		$sstring = nl2br($sstring);
		$sstring = strip_tags($sstring);
		$sstring = htmlspecialchars($sstring);
		
		//TODO ЗАМЕНА ИЗ СПИСКА ПОДСТАНОВКИ		
		
		
		
		
		return "'" . $sstring . "'";	
		}
        return "''";        
    }
    
  
}